/**
 * 
 */
package com.nari.baseinfo.dao;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.nari.baseinfo.model.IHeatMeter;
import com.nari.coreframe.dao.hibernate3.IGenericDao;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResponseMsg;
import com.nari.platform.model.ResultWithPageCond;

/**
 * 
 * @author Xiaopeng
 * @date 2013-8-1
 */
public interface IHeatMeterDao extends IGenericDao<IHeatMeter, String> {

	/**
	 * 分页查询热量表数据
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param meterNo 热量表表号(可选)
	 * @param meterType 热表型号(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-26
	 */
	public ResultWithPageCond<IHeatMeter> queryHeatMeterPage(String projectUID, String communityUID, 
			String meterNo, String meterType, PageCond pageCond) throws Exception;
	
	/**
	 * 通过热量表表号查询热量表信息
	 * @param meterNo
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-30
	 */
	public IHeatMeter queryMeterByMeterNo(String meterNo) throws Exception;
	
	/**
	 * 通过热量表所属关系查询热量表列表
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param shareAreaUID 所属分摊域(可选)
	 * @return 若所属关系均不存在，则返回空列表
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-30
	 */
	public List<IHeatMeter> queryMetersByBelongs(String projectUID, String communityUID, 
			String buildingUID, String shareAreaUID) throws Exception;
	
	/**
	 * 通过热量表所属关系统计热量表个数
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param shareAreaUID 所属分摊域(可选)
	 * @return 
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-30
	 */
	public long countMeterNumberByBelongs(String projectUID, String communityUID, 
			String buildingUID, String shareAreaUID) throws Exception;
	
	/**
	 * 根据所属分摊域信息查询热量表信息
	 * @param shareAreaUID 所属分摊域(必选)
	 * 说明：若分摊域ID不存在，则返回零结果集
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param meterNo 热量表表号(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-3
	 */
	public ResultWithPageCond<IHeatMeter> queryHeatMeterPageByAreaUID(String shareAreaUID, 
			String projectUID, String communityUID, String meterNo, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 查询不隶属于某个分摊域下的热量表列表
	 * @param shareAreaUID 所属分摊域(必选)
	 * 说明：若分摊域ID不存在，则返回零结果集
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param meterNo 热量表表号(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-3
	 */
	public ResultWithPageCond<IHeatMeter> queryMeterPageExceptAreaUID(String shareAreaUID, 
			String projectUID, String communityUID, String meterNo, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 批量设置热量表所属分摊域信息
	 * @param shareAreaUID 所属分摊域
	 * @param meterIDList 热量表ID列表，格式：XXX,XXX,XXX
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-3
	 */
	public ResponseMsg saveHeatMeterArea(String shareAreaUID, String meterIDList) throws Exception;
	
	/**
	 * 根据分摊域、热量表计算关系等查询热量表列表
	 * @param shareAreaUID 所属分摊域(必选)
	 * @param calculateType 热量表计算关系(必选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public List<IHeatMeter> queryHeatMetersByAreaUID(String shareAreaUID, 
			String calculateType) throws Exception;
	
	/**
	 * 通过热量表所属关系统计热量表的个数
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param shareAreaUID 所属分摊域(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-23
	 */
	public int countMeterSumByBelongs(String projectUID, String communityUID, 
			String buildingUID, String shareAreaUID) throws Exception;
	
	/**
	 * 系统热量表表号唯一性统计
	 * @param meterNo
	 * @param meterUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-5-8
	 */
	public int queryMeterNoUniqueCount(String meterNo, String meterUID) throws Exception;

	public abstract void saveHeatMeters(Collection heatmeters) throws Exception;

	public ResultWithPageCond<IHeatMeter> queryHeatMeterPage(String projectUID,
			String communityUID, String buildingUID, String unitUID,
			String meterNo, String meterType, PageCond pageCond) throws Exception;

	public abstract ArrayList<String> queryHeatMeterNos(String projectUID, String communityUID,
			String buildingUID, String unitUID, String meterNo, String meterType)
			throws Exception;;
}
